MFC之变量类型

https://blog.csdn.net/a1459268562/article/details/70653695

在MFC中定义的基本变量

首先,所有的变量都被从小写定义成了大写。如:

typedef int BOOL;//TRUE FALSE

typedef unsigned char BYTE;

typedef float FLOAT;

typedef int INT;

typedef char CHAR;

typedef short SHORT;

typedef long LONG;

typedef CHAR* PCHAR, LPSTR; //可写的字符指针变量

#ifndef VOID

#define VOID void

还有字的定义:

typedef unsigned long DWORD;//双字

typedef unsigned short WORD;//单字

所有的无符号变量都加上U来区分。如:

typedef unsigned int UINT;

所有的指针类型变量都加上P来区分。如:

typedef FLOAT * PFLOAT;

typedef BOOL near * PBOOL;

typedef BOOL far* LPBOOL;

typedef BYTE near * PBYTE;

typedef BYTE far* LPBYTE;

typedef int near* PINT;

typedef int far * LPINT;

typedef WORD near * PWORD;

typedef WORD far* LPWORD;

typedef long far* LPLONG;

typedef DWORD near * PDWORD;

typedef DWORD far * LPDWORD;

typedef void far* LPVOID;

typedef CONST void far * LPCVOID;

//near和far是c语言相对古老的的用法,用于声明变量在内存中的远近(以前16位的dos操作系统,最大有64K的内存,紧缺的很~)。

所有的常量指针都使用C。如:

typedef CONST void* LPCVOID;

typedef CONST CHAR * LPCSTR, * PCSTR;//只读的字符指针变量

结构体类型。主要有三个POINT、SIZE、RECT

typedef struct tagPOINT

{

LONG x;

LONG y;

} POINT, * PPOINT, * LPPOINT;//结构体别名

typedef struct tagSIZE
{
    LONGcx;
    LONGcy;
} SIZE, * PSIZE, * LPSIZE;
typedef struct tagRECT
{
    LONGleft;
    LONGtop;
    LONGright;
    LONGbottom;
} RECT, * PRECT, * LPRECT;

3. 最神奇的句柄类型。

句柄是一种故意隐藏了内容的结构体指针。看一下HWND的声明:

DECLARE_HANDLE(HWND);

#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ * name

可以看到HWND就是结构体的指针,而结构体的内容是unused,(拒绝使用~)。

- HWND 窗口句柄

- HINSTANCE 进程实例句柄

- HCURSOR 光标句柄

- HICON 图标句柄

- HMENU 菜单句柄

- HFONT 字体句柄

- HFILE 文件句柄

- 等

4. 最复杂的字符串指针类型

首先,谈精简版的历史。很早以前,各国文字都有自己的编码方式,而且每个国家字符的字节也不一样(多字节字符)。后来,拥有了统一的编码方式,统一了编码--Unicode。

vs中创建项目时,默认是Unicode编码的。可以使用wchar_t来声明Unicode编码的字符串,而且字符串声明时在前面加上L。TCHAR是一个怪胎,他是char和wchar_t的自适应版。

const char * p = “aaa”; //内存中,每个a占有一个字节

const char * pc = “中国”;//内存中,每个汉字占有两个字节

const wchar_t * pU = L”aa”;//内存中,每个a占有两个字节

const wchar_t * pcU = L”中国”;//内存中,每个汉字占有一个字节

const TCHAR * s = L”aa”;//这个TCHAR声明时,必须声明成Unicode编码的串

/*

//修改vs的编码方式为’多字节字符集’后

const TCHAR * s =L”aa”;//这就会报错,因为这时候TCHAR是char类型

const TCHAR * s =”aa”;//不会报错

* /

本页共105段,2833个字符,4013 Byte(字节)